package com.zkh.myutils.utils;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.function.Function;

/**
 * 集合工具类
 * @author zkh
 */
public class CollectionUtils {

	/**
	 * 自定义数组类型转换
	 * @param <T> 目标类型
	 * @param <K> 源类型
	 * @param origin 源数组
	 * @param cls 目标类型
	 * @param fun 自定义转换逻辑
	 * @return
	 */
	public static <T, K> List<T> convertType(List<K> origin, Function<K, T> fun) {
		//为null
		if(origin==null) {
			return null;
		}
		//初始化
		List<T> list = new ArrayList<T>();
		//遍历转换
		origin.forEach(e->list.add(fun.apply(e)));
		//返回
		return list;
	}
	
	/**
	 * 分割集合
	 * @param set 待分割的Set集合
	 * @param size 每组集合最大长度
	 * @return
	 */
	public static <T> List<List<T>> split(Set<T> set, int size){
		//不为空
		Objects.requireNonNull(set);
		//转换为List再处理
		return split(new ArrayList<T>(set), size);
	}
	

	/**
	 * 分割集合
	 * @param list 待分割的List集合
	 * @param size 每组集合最大长度
	 * @return
	 */
	public static <T> List<List<T>> split(List<T> list, int size){
		//不为空
		Objects.requireNonNull(list);
		//子集合长度
		if(size<1) {
			throw new UtilsException("每组集合长度至少为1");
		}
		//容器
		List<List<T>> ctn = new ArrayList<List<T>>();
		//不是空集合
		if(!list.isEmpty()) {
			//小于一页
			if(list.size()<=size) {
				ctn.add(list);
			}//大于一页
			else {
				//计算页码
				int page = list.size()/size;
				//不满一页，算为一页
				if(list.size()%size != 0) {
					page++;
				}
				//遍历
				for(int i=0; i<page; i++) {
					//分割
					ctn.add(list.subList(i*size, i==page-1 ? list.size() : i*size + size));
				}
			}
		}
		//返回容器
		return ctn;
	}
	
	/**
	 * 将多个集合组装成一个集合
	 * @param lists 多个集合
	 * @return 返回组合后的新集合
	 */
	@SuppressWarnings("unchecked")
	public static <T> List<T> combine(List<T>... lists){
		//创建泛型集合容器
		List<T> list = new ArrayList<T>();
		//遍历并保存值
		ArrayUtils.forEach(lists, (v)->list.addAll(v));
		//返回组装后的集合
		return list;
	}
}
